package ltd.trackan.commonredis.service;


import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author wxa
 */
@Service
public interface RedisService {

    /**
     * 设置指定 key 的过期时间。
     *
     * @param key  键
     * @param time 过期时间（秒）
     * @return 是否设置成功
     */
    boolean expire(String key, long time);

    /**
     * 获取指定 key 的剩余过期时间。
     *
     * @param key 键
     * @return 剩余过期时间（秒）
     */
    long getExpire(String key);

    /**
     * 判断指定 key 是否存在。
     *
     * @param key 键
     * @return 是否存在
     */
    boolean hasKey(String key);

    /**
     * 删除指定的多个 key。
     *
     * @param collection 键集合
     * @return 是否删除成功
     */
    boolean del(Collection<String> collection);

    /**
     * 删除指定的单个 key。
     *
     * @param key 键
     * @return 是否删除成功
     */
    boolean del(String key);

    /**
     * 设置指定 key 的值。
     *
     * @param key   键
     * @param value 值
     * @return 是否设置成功
     */
    boolean set(String key, Object value);

    /**
     * 设置指定 key 的值，并可设置过期时间。
     *
     * @param key   键
     * @param value 值
     * @param time  过期时间（秒）
     * @return 是否设置成功
     */
    boolean set(String key, Object value, long time);

    /**
     * 获取指定 key 的值。
     *
     * @param key 键
     * @return 值
     */
    Object get(String key);

    /**
     * 获取哈希表中指定字段的值。
     *
     * @param key  键
     * @param item 字段
     * @return 值
     */
    Object hget(String key, String item);

    /**
     * 获取哈希表中所有的键值对。
     *
     * @param key 键
     * @return 键值对映射
     */
    Map<Object, Object> hget(String key);

    /**
     * 删除哈希表中指定的字段。
     *
     * @param key  键
     * @param hKey 字段数组
     * @return 是否删除成功
     */
    boolean hdel(String key, Object... hKey);

    /**
     * 向哈希表中添加字段和值。
     *
     * @param key   键
     * @param item  字段
     * @param value 值
     * @return 是否添加成功
     */
    boolean hset(String key, String item, Object value);

    /**
     * 向哈希表中添加字段和值，并设置过期时间。
     *
     * @param key   键
     * @param item  字段
     * @param value 值
     * @param time  过期时间（秒）
     * @return 是否添加成功
     */
    boolean hset(String key, String item, Object value, long time);

    /**
     * 判断哈希表中是否存在指定字段。
     *
     * @param key  键
     * @param item 字段
     * @return 是否存在
     */
    boolean hHasKey(String key, String item);

    /**
     * 递增哈希表中指定字段的值。
     *
     * @param key   键
     * @param delta 递增因子
     * @return 递增后的值
     */
    long incr(String key, long delta);

    /**
     * 递减哈希表中指定字段的值。
     *
     * @param key   键
     * @param delta 递减因子
     * @return 递减后的值
     */
    long decr(String key, long delta);

    /**
     * 向哈希表中添加多个字段和值。
     *
     * @param key 键
     * @param map 字段和值的映射
     * @return 是否添加成功
     */
    boolean hmset(String key, Map<String, Object> map);

    /**
     * 向哈希表中添加多个字段和值，并设置过期时间。
     *
     * @param key  键
     * @param map  字段和值的映射
     * @param time 过期时间（秒）
     * @return 是否添加成功
     */
    boolean hmset(String key, Map<String, Object> map, long time);

    /**
     * 递增哈希表中指定字段的值。
     *
     * @param key  键
     * @param item 字段
     * @param by   递增因子
     * @return 递增后的值
     */
    double hincr(String key, String item, double by);

    /**
     * 递减哈希表中指定字段的值。
     *
     * @param key  键
     * @param item 字段
     * @param by   递减因子
     * @return 递减后的值
     */
    double hdecr(String key, String item, double by);

    /**
     * 获取集合中所有元素。
     *
     * @param key 键
     * @return 元素集合
     */
    Set<Object> sGet(String key);

    /**
     * 判断集合中是否存在指定元素。
     *
     * @param key   键
     * @param value 元素
     * @return 是否存在
     */
    boolean sHasKey(String key, Object value);

    /**
     * 向集合中添加元素。
     *
     * @param key    键
     * @param values 元素数组
     * @return 添加的元素数量
     */
    long sSet(String key, Object... values);

    /**
     * 向集合中添加元素，并设置过期时间。
     *
     * @param key    键
     * @param time   过期时间（秒）
     * @param values 元素数组
     * @return 添加的元素数量
     */
    long sSetAndTime(String key, long time, Object... values);

    /**
     * 获取集合的大小。
     *
     * @param key 键
     * @return 集合大小
     */
    long sGetSetSize(String key);

    /**
     * 移除集合中的元素。
     *
     * @param key    键
     * @param values 元素数组
     * @return 移除的元素数量
     */
    long setRemove(String key, Object... values);

    /**
     * 获取列表中指定范围的元素。
     *
     * @param key   键
     * @param start 开始索引
     * @param end   结束索引
     * @return 元素列表
     */
    List<Object> lGet(String key, long start, long end);

    /**
     * 获取列表的大小。
     *
     * @param key 键
     * @return 列表大小
     */
    long lGetListSize(String key);

    /**
     * 获取列表中指定索引的元素。
     *
     * @param key   键
     * @param index 索引
     * @return 元素
     */
    Object lGetIndex(String key, long index);

    /**
     * 向列表右端添加元素。
     *
     * @param key   键
     * @param value 元素
     * @return 是否添加成功
     */
    boolean lSet(String key, Object value);

    /**
     * 向列表右端添加元素，并设置过期时间。
     *
     * @param key   键
     * @param value 元素
     * @param time  过期时间（秒）
     * @return 是否添加成功
     */
    boolean lSet(String key, Object value, long time);

    /**
     * 向列表右端添加多个元素。
     *
     * @param key   键
     * @param value 元素列表
     * @return 是否添加成功
     */
    boolean lSet(String key, List<Object> value);

    /**
     * 向列表右端添加多个元素，并设置过期时间。
     *
     * @param key   键
     * @param value 元素列表
     * @param time  过期时间（秒）
     * @return 是否添加成功
     */
    boolean lSet(String key, List<Object> value, long time);

    /**
     * 更新列表中指定索引的元素。
     *
     * @param key   键
     * @param index 索引
     * @param value 新元素
     * @return 是否更新成功
     */
    boolean lUpdateIndex(String key, long index, Object value);

    /**
     * 移除列表中指定数量的元素。
     *
     * @param key   键
     * @param count 移除数量
     * @param value 元素
     * @return 移除的元素数量
     */
    long lRemove(String key, long count, Object value);

    /**
     * 获取匹配指定前缀的所有 key。
     *
     * @param keyPrefix key 前缀
     * @return 匹配的 key 集合
     */
    Set<String> keys(String keyPrefix);

    /**
     * 删除匹配指定前缀的所有 key。
     *
     * @param keyPrefix key 前缀
     */
    void removeAll(String keyPrefix);
}
